package com.kotlin

/**
 * 扩展函数的使用
 * 1、扩展一个普通函数
 * 2、扩展一个泛型函数
 * 扩展不能真正的修改他们所扩展的类。通过定义一个扩展，你并没有在一个类中插入新成员， 仅仅是可以通过该类型的变量用点表达式去调用这个新函数。
 * 我们想强调的是扩展函数是静态分发的，即他们不是根据接收者类型的虚方法。 这意味着调用的扩展函数是由函数调用所在的表达式的类型来决定的， 而不是由表达式运行时求值结果决定的。
 * @author huan.fu
 * @date 2019-03-11 - 10:04
 */

/**
 * 1、给 Array<Int> 扩展一个 print 函数
 *      类型.(需要扩展的函数名)
 *      扩展函数中的this 为 调用.print 方法的 .前面的对象
 */
fun Array<String>.print(join: String = ",") {
    val result = this.foldIndexed(StringBuilder()) { index, builder, element ->
        builder.append(if (index != 0) join else "").append(element)
    }
    println(result)
}

/**
 * 2、增加一个泛型扩展 及给所有的Array都增加一个print函数
 */
fun <T> Array<T>.print(join: String = ",") {
    val result = this.foldIndexed(StringBuilder()) { index, builder, element ->
        builder.append(if (index != 0) join else "").append(element)
    }
    println(result)
}

fun main() {
    // 1、测试给Array<Int>增加的扩展
    arrayOf("123", "456", "789").print()
    // 2、测试泛型扩展
    arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9).print(join = "><")
}

